package task1

import (
	"context"
	"fmt"
	"log"

	"github.com/day01/config"
	"github.com/ethereum/go-ethereum/accounts/abi/bind"
	"github.com/ethereum/go-ethereum/common"
	"github.com/ethereum/go-ethereum/crypto"
	"github.com/ethereum/go-ethereum/ethclient"

	token "github.com/day01/counter" // 导入生成的ERC20代币绑定
)

func task2(config *config.Config) {
	client, err := ethclient.Dial(config.RPC.SepoliaWS)
	if err != nil {
		panic("链接网络错误")
	}

	// 从配置文件读取要查询的代币合约地址
	tokenAddress := common.HexToAddress(config.Addresses.TokenContract)
	fmt.Printf("代币合约地址: %s\n", tokenAddress.Hex())

	// 使用生成的绑定创建代币合约实例
	instance, err := token.NewCounter(tokenAddress, client)
	if err != nil {
		// 如果创建合约实例失败，记录错误并终止程序
		log.Fatal(err)
	}

	// 从配置文件读取私钥并创建TransactOpts（用于写入操作）
	privateKey, err := crypto.HexToECDSA(config.Accounts.Main.PrivateKey)
	if err != nil {
		log.Fatal(err)
	}

	// 获取链ID
	chainID, err := client.NetworkID(context.Background())
	if err != nil {
		log.Fatal(err)
	}

	// 创建TransactOpts用于调用写入操作
	auth, err := bind.NewKeyedTransactorWithChainID(privateKey, chainID)
	if err != nil {
		log.Fatal(err)
	}

	// 调用Inc()方法（写入操作，需要TransactOpts）
	tx, err := instance.Inc(auth)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("Inc transaction sent: %s\n", tx.Hash().Hex())

	// 调用Count()方法（只读操作，返回*big.Int）
	count, err := instance.Count(&bind.CallOpts{})
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("Count: %s\n", count.String())

	// 调用Get()方法（只读操作，返回*big.Int）
	getValue, err := instance.Get(&bind.CallOpts{})
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("Get: %s\n", getValue.String())

}
